<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from oil.tnf on 19 December 2010 -->

<TITLE>Oil Reference Manual - Introduction</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Oil Reference Manual</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="oil_2.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="oil_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC1" HREF="oil_toc.html#SEC1">Introduction</A></H1>
<P>
OIL deals with three primary concepts: operators, types and indications.
The operators which OIL refers to are strongly typed functions.
The types which are named in an OIL specification are referred to as
`primitive types' but there are also `constructed types' which are
created at compile time.
Indications are a name given to a list of operators which may be
identified by an appearance of an indication in an expression.
<P>
Although operators, types and indications are primary terms in
discussing OIL and operator identification,
the rest of this chapter is devoted to explanations of:
<DL COMPACT>
<DT><CODE>Operator identification::</CODE>
<DD>A review of operator identification by example.
<DT><CODE>Coercions::</CODE>
<DD>Coercions allow the compiler to use a value of one type where another
is specified. 
<DT><CODE>Sets of possible types::</CODE>
<DD>The set of all the types  which an expression might return.
<DT><CODE>Classes::</CODE>
<DD>A set of operators and coercions which can be instantiated for a newly
created constructed type.
<DT><CODE>Names::</CODE>
<DD>An enumeration associated with each operator, type and class identifier.
</DL>
<P>
<H2><A NAME="SEC2" HREF="oil_toc.html#SEC2">Operator identification</A></H2>
<P>
Anyone familiar with compiler construction is familiar with operator
identification but may not necessarily know it by that name.  Thus operator
identification is introduced by an example. 
<P>
In Pascal the
expression <CODE>x+y</CODE> can have a number of meanings or it may be
invalid.  For it to be valid <CODE>x</CODE> and <CODE>y</CODE> must refer to type
values which allow the identification of a well typed operator
associated with <CODE>+</CODE>.  The operator identified might be <EM>integer
addition</EM>, <EM>real addition</EM> or <EM>set union</EM>.  The operator
identified is determined by the types associated with <CODE>x</CODE> and
<CODE>y</CODE> and be formulated like:
<P>
<UL>
<LI>
<CODE>x</CODE> and <CODE>y</CODE> are both integer then <EM>integer addition</EM>
<P>
<LI>
<CODE>x</CODE> and <CODE>y</CODE> are <EM>set</EM>s with the same element type then
<EM>set union</EM>
<P>
<LI>
one of <CODE>x</CODE> and <CODE>y</CODE> is <EM>real</EM> and the other is <EM>real</EM>
         or <EM>integer</EM> then <EM>real addition</EM>
<P>
<LI>
otherwise <CODE>x+y</CODE> is undefined or an error
<P>
</UL>
<P>
The <CODE>+</CODE> in <CODE>x+y</CODE> is called the indication and <CODE>x</CODE> and
<CODE>y</CODE> are the operands.  The process of operator identification
chooses a strongly typed operator associated with the indication and has
a type signature which matches the types of the operands.  This is a
simplification but it does capture the essentials of operator
identification.
<P>
The operation of `matching' the operand type with the type signature is
really the relation `is coercible to', see  <A HREF="oil_1.html#SEC3">Coercions</A>.
<P>
<H2><A NAME="SEC3" HREF="oil_toc.html#SEC3">Coercions</A></H2>
<P>
A coercion is a distinguished operator which the compiler may insert in
an expression to make operator identification possible.  In the previous
section the Pascal expression <CODE>x+y</CODE> could identify a real
expression if <CODE>x</CODE>'s type was real but <CODE>y</CODE>'s type was integer.
OIL allows this to be specified using a coercion from integer to real.
Thus whenever an integer is supplied but a real is required the compiler
may apply the coercion to the integer argument and thus have only real
arguments to identify real addition with.
<P>
If there is a coercion from type <EM>A</EM> to type <EM>B</EM> then type
<EM>A</EM> is said to be `coercible to' type <EM>B</EM>.
<P>
A coercion sequence is any number of coercions applied in sequence.  In
OIL a coercion sequence is used as if it were a single coercion.  Thus
if type <EM>A</EM> is coercible to type <EM>B</EM> and type <EM>B</EM> is
coercible to type <EM>C</EM> then there is a coercion sequence from type
<EM>A</EM> to type <EM>C</EM>.  The elements in the sequence are the coercion
operators in the order they need to be applied to satisfy the type
constraint.  Thus using a coercion sequence type <EM>A</EM> may match and
argument of type <EM>C</EM>.
<P>
Coercion sequences lead to a revised definition of `coercible to'.
If there is a coercion sequence from type <EM>A</EM> to type <EM>B</EM> then type
<EM>A</EM> is said to be `coercible to' type <EM>B</EM>.  Note that since a
coercion sequence may be empty every type is coercible to itself.
<P>
<H2><A NAME="SEC4" HREF="oil_toc.html#SEC4">Sets of possible types</A></H2>
<P>
Each type has an associated <EM>set of possible types</EM>.  A type <EM>B</EM>
is in the set of possible types for type <EM>A</EM> if <EM>A</EM> is coercible
to <EM>B</EM>.
<P>
Likewise an expression may have a set of possible types. Take <CODE>x+y</CODE>
as an example.  The set of possible types associated with the expression
would include the result type of any operator which can be identified by
<CODE>+</CODE> and an element from the set of possible types for <CODE>x</CODE> and
an element from the set of possible types for <CODE>y</CODE>.
<P>
Note that the set of possible types is a transitive closure of the
relation `is coercible to'.  When a new coercion is created then the
transitive closure of every type may need to be updated.  But in
practice this is not the case and most coercions have no impact on the
set of possible types for most types.
<P>
<H2><A NAME="SEC5" HREF="oil_toc.html#SEC5">Classes</A></H2>
<P>
Formally OIL's classes are parametric abstract types.  But they may be
most easily comprehended as a procedure which takes some types as an
argument and creates a new type and adds a set of operators and
coercions into an existing type schema.  The net effect being that the
new operators may now be identified and the set of possible types for
some types may be increased.
<P>
Consider the subrange type constructor in Pascal.
It creates a coercion from the subrange to the base type.
<P>
<A NAME="IDX1"></A>
<H2><A NAME="SEC6" HREF="oil_toc.html#SEC6">Names for operators, types and classes</A></H2>
<P>
You will want associate semantics to the identifiers in your OIL
specification.  <EM>Names</EM> allow a convenient way of doing that.  All
types, classes and operators have names associated with them.  The name is
represented as a definition table key
(see  <A HREF="deftbl_1.html#SEC2">The Definition Table Module of Definition Table</A>)
and can be referenced in your attribute grammar
by the identifier used in the OIL specification.
<P>
The name associated with an ADT type, class or operator is accessed by
using the unary functions: <CODE>OilTypeName</CODE>, <CODE>OilClassName</CODE> and
<CODE>OilOpName</CODE>.
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="oil_2.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="oil_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
